/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Servlets;

import com.akcess.exception.Atributos_recursosException;
import com.akcess.exception.Datos_atributoException;
import com.akcess.exception.RecursoException;
import com.akcess.exception.RecursoRecordCountException;
import com.akcess.exception.Recurso_movilException;
import com.akcess.impl.Atributos_recursosDAOImpl;
import com.akcess.vo.Atributos_recursos;
import com.akcess.vo.Datos_atributo;
import com.akcess.vo.Recurso_movil;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.*;
import javax.servlet.http.HttpSession;
import manejadores.*;

/**
 *
 * @author Ramon
 */
public class GestionarRecursos_Moviles extends HttpServlet {
    private String dirBASE="jsp/RecursoMovil";
   
    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
    * @param request servlet request
    * @param response servlet response
    */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet GestionarRecursos_Moviles</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet GestionarRecursos_Moviles at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
            */
        } finally { 
            out.close();
        }
    } 

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
    * Handles the HTTP <code>GET</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        String accion = request.getParameter("hacer");
        request.setAttribute("modulo", "Recursos Moviles");
        //Saco el parametro id, del request, para la parte de editar y borrar
        int id = 0;
        try {
            id = Integer.parseInt(request.getParameter("id"));
        } catch (NumberFormatException e) {
        }
        try {

            if (accion.equals("Agregar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/AgregarRM.jsp");
                dispatcher.forward(request, response);

            }
            if (accion.equals("Ver")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/VerRM.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("Borrar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarBorrarRM.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("Modificar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarModificarRM.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("opModificar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ModificarRM.jsp");
                dispatcher.forward(request, response);
            }
            if (accion.equals("modificacion")) {
                this.ModificarRM(request, response);
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarModificarRM.jsp");
                dispatcher.forward(request, response);
            }
            
            if (accion.equals("Listar")) {
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/listarRM.jsp");
                dispatcher.forward(request, response);
            } else if (accion.equals("opBorrar")) {
                if (this.BorrarRM(request,response,id)) {
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarBorrarRM.jsp");
                    dispatcher.forward(request, response);
                } else {
                    request.setAttribute("Error", "El recurso no puede ser borrado, pues existen reservas o solicitudes dependientes del mismo");
                    RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarBorrarRM.jsp");
                    dispatcher.forward(request, response);
                }
                
               

            }else  if (accion.equals("modificacion")) {
                this.ModificarRM(request, response);
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/ListarModificarRM.jsp");
                dispatcher.forward(request, response);
            }else if(accion.equals("agregacion")){
                this.AgregarRM(request, response);
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/listarRM.jsp");
                dispatcher.forward(request, response);
            }else if(accion.equals("traerCampos")){
                RequestDispatcher dispatcher = request.getRequestDispatcher(this.dirBASE+"/AgregarRM.jsp");
                dispatcher.forward(request, response);
            }
            
        } catch (Exception ex) {
            try {
                GestionarUsuarios.sendErrorRedirect(request, response, "jsp/errores/errorGenerico.jsp", ex);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    } 

    /** 
    * Handles the HTTP <code>POST</code> method.
    * @param request servlet request
    * @param response servlet response
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        this.doGet(request, response);
    }

   
    /** 
    * Returns a short description of the servlet.
    */
    public String getServletInfo() {
        return "Gestiona los recursos moviles, tiene las operaciones basicas...";
    }// </editor-fold>
    
    /**
     * Obtengo los datos del formulario que es enviado por medio del request. Para obtener los atributos del formulario
     * Tambien necesito el tipo de recurso movil  que es enviado con el formulario con los datos del recurso. 
     * En la base datos solo son guardados los datos que especifican el tipo de recurso con sus atributos. Si un recurso 
     * de un tipo es guardado con un conjunto de atributos y luego el tipo de recurso se le agrega mas atributos y recurso
     * guardado ya no guardara datos en esos atributos.
     * @param request Recibe una cantidad variable de datos de un tipo de recurso dado. 
     * @param response
     * @throws com.akcess.exception.Atributos_recursosException
     * @throws com.akcess.exception.RecursoException
     * @throws com.akcess.exception.Recurso_movilException
     * @throws com.akcess.exception.RecursoRecordCountException
     * @throws com.akcess.exception.Datos_atributoException
     */ 
    protected void AgregarRM(HttpServletRequest request, HttpServletResponse response) throws Atributos_recursosException, RecursoException, Recurso_movilException, RecursoRecordCountException, Datos_atributoException {
        

        ManejadorRecursoMovil manejadorRM = null;
        HttpSession session = request.getSession(false);
        Atributos_recursos[] atributos = null;

        int tipoDeRecurso = 0;
        Connection con;
        if (session != null) {
            con = (Connection) session.getAttribute("conexion");
            //Traigo todos los atributos que tiene un determinado tipo

            tipoDeRecurso = Integer.parseInt(request.getParameter("TipoRecurso"));

            Atributos_recursosDAOImpl mAtributos = new Atributos_recursosDAOImpl();
            atributos = mAtributos.BuscarAtributosDeTipo(tipoDeRecurso, con);
            manejadorRM = new ManejadorRecursoMovil(con);
        }

        Datos_atributo[] datos = new Datos_atributo[atributos.length];//Es el vector donde vamos a guardar los datos


        //Traigo todos los datos del formulario
        String nombre = request.getParameter("nombre");
        String obs = request.getParameter("observacion");
        for (int i = 0; i < atributos.length; i++) {
            //Armo la terna para luego agregar al vector de datos que tiene el recurso.
            int id = atributos[i].getId_atributos();
            Datos_atributo ternaDeDato = new Datos_atributo();
            ternaDeDato.setId_tipo_recurso(tipoDeRecurso);
            ternaDeDato.setId_atributos(id);
            String nombreAtributo = atributos[i].getNombre();
            String dato = request.getParameter(nombreAtributo.replace(" ", "_"));//Saco el dato del formulario

            ternaDeDato.setValor(dato);//Pongo el valor en la terna para insertar 
            datos[i] = ternaDeDato;
        }
        //Creo el nuevo recurso con sus datos por recurso.
        Recurso_movil rm = new Recurso_movil();
        rm.setNombre(nombre);
        rm.setObservacion(obs);
        rm.setDatos(datos);
        //Agrego el recurso a la Base de Datos
        manejadorRM.AgregarRM(rm);
    }
    
/**
 * Modifica los datos de un recurso movil especificado.
 * @param request Contiene el tipo de recurso, el id de recurso que se quiere modificar y los datos contenidos para los atributos que tiene el tipo dado.
 * @param response
 * @throws com.akcess.exception.Atributos_recursosException
 * @throws com.akcess.exception.RecursoException
 * @throws com.akcess.exception.Recurso_movilException
 * @throws com.akcess.exception.RecursoRecordCountException
 * @throws com.akcess.exception.Datos_atributoException
 */
    
    protected void ModificarRM(HttpServletRequest request, HttpServletResponse response) throws Atributos_recursosException, RecursoException, Recurso_movilException, RecursoRecordCountException, Datos_atributoException
    {
        

        ManejadorRecursoMovil manejadorRM = null;
        HttpSession session = request.getSession(false);
        Atributos_recursos[] atributos = null;

        int tipoDeRecurso = 0;
        long id_recurso = 0;
        Connection con;
        if (session != null) {
            con = (Connection) session.getAttribute("conexion");
            //Traigo todos los atributos que tiene un determinado tipo
            tipoDeRecurso = Integer.parseInt(request.getParameter("TipoRecurso"));
            id_recurso=Long.parseLong(request.getParameter("id"));
            Atributos_recursosDAOImpl mAtributos = new Atributos_recursosDAOImpl();
            atributos = mAtributos.BuscarAtributosDeTipo(tipoDeRecurso, con);
            manejadorRM = new ManejadorRecursoMovil(con);
        }

        Datos_atributo[] datos = new Datos_atributo[atributos.length];//Es el vector donde vamos a guardar los datos


        //Traigo todos los datos del formulario
        String nombre = request.getParameter("nombre");
        String obs = request.getParameter("observacion");
        String dispStr=request.getParameter("disponible");
        
        for (int i = 0; i < atributos.length; i++) {
            //Armo la terna para luego agregar al vector de datos que tiene el recurso.
            int id = atributos[i].getId_atributos();
            Datos_atributo ternaDeDato = new Datos_atributo();
            ternaDeDato.setId_tipo_recurso(tipoDeRecurso);
            ternaDeDato.setId_atributos(id);
            String nombreAtributo = atributos[i].getNombre();
            String dato = request.getParameter(nombreAtributo.replace(" ", "_"));//Saco el dato del formulario

            ternaDeDato.setValor(dato);//Pongo el valor en la terna para insertar 
            datos[i] = ternaDeDato;
        }
        //Creo el nuevo recurso con sus datos por recurso.
        Recurso_movil rm = new Recurso_movil();
        rm.setId_recurso(id_recurso);
        rm.setNombre(nombre);
        rm.setObservacion(obs);
        rm.setDisponible(Boolean.parseBoolean(dispStr));
        
        rm.setDatos(datos);
        //Agrego el recurso a la Base de Datos
        manejadorRM.ModificarRM(rm);
    }
    /**
     * Borra un recurso movil de forma logica.
     * @param request Contien el id del recurso que se quiere borrar y la conexion a la base de datos asignada a un usuario. Un recurso que esta reservado o en solicidud pendiente no se puede borrar.
     * @param response 
     * @param id Es un entero que indica el id de recurso.
     * @return Retorna TRUE si se pudo borrar y FALSE en el caso de no.
     */
    protected boolean BorrarRM(HttpServletRequest request, HttpServletResponse response,int id){
        try {

            HttpSession session = request.getSession(false);
            Connection cone;
            cone = (Connection) session.getAttribute("conexion");
            ManejadorRecursoMovil manejador = new ManejadorRecursoMovil(cone);
            manejador.BorrarRM(id);
            return true;
        } catch (RecursoException ex) {
            return false;
            
        }
    }
    

}
